<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Org\Util;

/**
 * ArrayList实现类
 * 
 * @category Think
 * @package Think
 * @subpackage Util
 * @author liu21st <liu21st@gmail.com>
 */
class ArrayList implements \IteratorAggregate {
	
	/**
	 * 集合元素
	 * 
	 * @var array
	 * @access protected
	 */
	protected $_elements = array ();
	
	/**
	 * 架构函数
	 * 
	 * @access public
	 * @param string $elements
	 *        	初始化数组元素
	 */
	public function __construct($elements = array()) {
		if (! empty ( $elements )) {
			$this->_elements = $elements;
		}
	}
	
	/**
	 * 若要获得迭代因子，通过getIterator方法实现
	 * 
	 * @access public
	 * @return ArrayObject
	 */
	public function getIterator() {
		return new ArrayObject ( $this->_elements );
	}
	
	/**
	 * 增加元素
	 * 
	 * @access public
	 * @param mixed $element
	 *        	要添加的元素
	 * @return boolean
	 */
	public function add($element) {
		return (array_push ( $this->_elements, $element )) ? true : false;
	}
	
	//
	public function unshift($element) {
		return (array_unshift ( $this->_elements, $element )) ? true : false;
	}
	
	//
	public function pop() {
		return array_pop ( $this->_elements );
	}
	
	/**
	 * 增加元素列表
	 * 
	 * @access public
	 * @param ArrayList $list
	 *        	元素列表
	 * @return boolean
	 */
	public function addAll($list) {
		$before = $this->size ();
		foreach ( $list as $element ) {
			$this->add ( $element );
		}
		$after = $this->size ();
		return ($before < $after);
	}
	
	/**
	 * 清除所有元素
	 * 
	 * @access public
	 */
	public function clear() {
		$this->_elements = array ();
	}
	
	/**
	 * 是否包含某个元素
	 * 
	 * @access public
	 * @param mixed $element
	 *        	查找元素
	 * @return string
	 */
	public function contains($element) {
		return (array_search ( $element, $this->_elements ) !== false);
	}
	
	/**
	 * 根据索引取得元素
	 * 
	 * @access public
	 * @param integer $index
	 *        	索引
	 * @return mixed
	 */
	public function get($index) {
		return $this->_elements [$index];
	}
	
	/**
	 * 查找匹配元素，并返回第一个元素所在位置
	 * 注意 可能存在0的索引位置 因此要用===False来判断查找失败
	 * 
	 * @access public
	 * @param mixed $element
	 *        	查找元素
	 * @return integer
	 */
	public function indexOf($element) {
		return array_search ( $element, $this->_elements );
	}
	
	/**
	 * 判断元素是否为空
	 * 
	 * @access public
	 * @return boolean
	 */
	public function isEmpty() {
		return empty ( $this->_elements );
	}
	
	/**
	 * 最后一个匹配的元素位置
	 * 
	 * @access public
	 * @param mixed $element
	 *        	查找元素
	 * @return integer
	 */
	public function lastIndexOf($element) {
		for($i = (count ( $this->_elements ) - 1); $i > 0; $i --) {
			if ($element == $this->get ( $i )) {
				return $i;
			}
		}
	}
	public function toJson() {
		return json_encode ( $this->_elements );
	}
	
	/**
	 * 根据索引移除元素
	 * 返回被移除的元素
	 * 
	 * @access public
	 * @param integer $index
	 *        	索引
	 * @return mixed
	 */
	public function remove($index) {
		$element = $this->get ( $index );
		if (! is_null ( $element )) {
			array_splice ( $this->_elements, $index, 1 );
		}
		return $element;
	}
	
	/**
	 * 移出一定范围的数组列表
	 * 
	 * @access public
	 * @param integer $offset
	 *        	开始移除位置
	 * @param integer $length
	 *        	移除长度
	 */
	public function removeRange($offset, $length) {
		array_splice ( $this->_elements, $offset, $length );
	}
	
	/**
	 * 移出重复的值
	 * 
	 * @access public
	 */
	public function unique() {
		$this->_elements = array_unique ( $this->_elements );
	}
	
	/**
	 * 取出一定范围的数组列表
	 * 
	 * @access public
	 * @param integer $offset
	 *        	开始位置
	 * @param integer $length
	 *        	长度
	 */
	public function range($offset, $length = null) {
		return array_slice ( $this->_elements, $offset, $length );
	}
	
	/**
	 * 设置列表元素
	 * 返回修改之前的值
	 * 
	 * @access public
	 * @param integer $index
	 *        	索引
	 * @param mixed $element
	 *        	元素
	 * @return mixed
	 */
	public function set($index, $element) {
		$previous = $this->get ( $index );
		$this->_elements [$index] = $element;
		return $previous;
	}
	
	/**
	 * 获取列表长度
	 * 
	 * @access public
	 * @return integer
	 */
	public function size() {
		return count ( $this->_elements );
	}
	
	/**
	 * 转换成数组
	 * 
	 * @access public
	 * @return array
	 */
	public function toArray() {
		return $this->_elements;
	}
	
	// 列表排序
	public function ksort() {
		ksort ( $this->_elements );
	}
	
	// 列表排序
	public function asort() {
		asort ( $this->_elements );
	}
	
	// 逆向排序
	public function rsort() {
		rsort ( $this->_elements );
	}
	
	// 自然排序
	public function natsort() {
		natsort ( $this->_elements );
	}
}
